<?php
// 应用公共文件
/**
 * 测试函数 执行完退出 可以传入任意个参数,只在调试模试下执行
 * @author 李海涛 <adv30@126.com>
 */
function pre()
{
    if (!APP_DEBUG) {
        return false;
    }
    // $argsNum = func_num_args(); //获取参数个数
    $args     = func_get_args();
    $debugArr = debug_backtrace();
    $timeArr  = explode(' ', microtime());
    echo "<meta http-equiv='Content-Type' content='text/mobile; charset=utf-8' />";
    echo "<pre  style='color:red'><hr><hr>【调用文件】:", ITEM_NAME, $debugArr [0] ['file'], '<br/>【调用行号】:', $debugArr [0] ['line'], '<br/>';
    echo '【调用时间】:', date('Y-m-d H:i:s ', $timeArr[1]), $timeArr[0], '<hr>';
    foreach ($args as $k => $v) {
        $getType = gettype($v);
        echo '【变量序号】:', $k + 1, '<br/>【变量类型】:', $getType, '<br/>';
        'boolean' == $getType ? var_dump($v) : print_r($v);
        echo '<hr>';
    }
    echo '<hr></pre>';
    exit;
}

/**
 * 测试函数 执行完不退出 可以传入任意个参数,只在调试模试下执行
 * @author 李海涛 <adv30@126.com>
 */
function pr()
{
    if (!APP_DEBUG) {
        return false;
    }
    // $argsNum = func_num_args(); //获取参数个数
    $args     = func_get_args();
    $timeArr  = explode(' ', microtime());
    $debugArr = debug_backtrace();
    echo "<meta http-equiv='Content-Type' content='text/mobile; charset=utf-8' />";
    echo "<pre  style='color:red'><hr><hr>【调用文件】:", ITEM_NAME, $debugArr [0] ['file'], '<br/>【调用行号】:', $debugArr [0] ['line'], '<br/>';
    echo '【调用时间】:', date('Y-m-d H:i:s ', $timeArr[1]), $timeArr[0], '<hr>';
    foreach ($args as $k => $v) {
        $getType = gettype($v);
        echo '【变量序号】:', $k + 1, '<br/>【变量类型】:', $getType, '<br/>';
        'boolean' == $getType ? var_dump($v) : print_r($v);
        echo '<hr>';
    }
    echo '<hr></pre>';
}

/**
 * [prw 将数组(任意维度)写入一个HTML文件],只在调试模试下执行
 * @author 李海涛 <adv30@126.com>
 * @return string           [返回一个字窜]
 */
function prw()
{
    // return false;
    if (!APP_DEBUG) {
        return false;
    }
    $args     = func_get_args();
    $debugArr = debug_backtrace();

    $filename = 'cbg.mobile';
    //如果最后一个参数为*.mobile,则将其作为写入文件的文件名
    if (is_string($args[count($args) - 1])) {
        $fileArr = explode('.mobile', $args[count($args) - 1]);
        if (2 == count($fileArr) && 0 == strlen($fileArr[1])) {
            if (is_numeric($fileArr[0]) && (int) ($fileArr[0]) == $fileArr[0] && $fileArr[0] < 900) {
                $fileArr[0] += 1000;
                $fileArr[0] = substr($fileArr[0], 1);
            }
            $filename = 'cbg' . $fileArr[0] . '.mobile';
            unset($args[count($args) - 1]);
        }
    }

    $timeArr  = explode(' ', microtime());
    $debugArr = debug_backtrace();
    $laststr  = "<meta http-equiv='Content-Type' content='text/mobile; charset=utf-8' />";
    $laststr  .= "<pre  style='color:red'>【调用文件】:" . ITEM_NAME . $debugArr [0] ['file'] . '<br/>【调用行号】:' . $debugArr [0] ['line'] . '<br/>';
    $laststr  .= '【调用时间】:' . date('Y-m-d H:i:s ', $timeArr[1]) . $timeArr[0] . '<hr/>';
    foreach ($args as $k => $v) {
        $getType = gettype($v);
        $laststr .= '【变量序号】:' . ($k + 1) . '<br/>【变量类型】:' . $getType . '<br/>';
        $laststr .= 'boolean' == $getType ? ( $v ? 'bool( true )' : 'bool( false )' ) : print_r($v, true);
        $laststr .= '<hr>';
    }
    $laststr .= '</pre>';
    file_put_contents($filename, $laststr);
}

//根据部门id获取最新公告
function getArticleByDepartmentId ()
{
    $departmentId = \App\Models\User\User::find(session('userId'));
    $res = \App\Models\Article\Article::where('department_ids', '=', $departmentId->department)
        ->orderBy('update_time', 'desc')
        ->first();
    if(!empty($res)){
        $res->toArray();
    }
    echo date('A H:i' , strtotime($res['update_time'])).' '.$res['content'];
}

/**
 * [prw 将数组(任意维度)写入一个HTML文件],如果文件存在,就追加,只在调试模试下执行
 * @author 李海涛 <adv30@126.com>
 * @return string           [返回一个字窜]
 */
function praw()
{
    // return false;
    if (!APP_DEBUG) {
        return false;
    }
    $args     = func_get_args();
    $debugArr = debug_backtrace();

    $filename = 'cbg.mobile';
    //如果最后一个参数为*.mobile,则将其作为写入文件的文件名
    if (is_string($args[count($args) - 1])) {
        $fileArr = explode('.mobile', $args[count($args) - 1]);
        if (2 == count($fileArr) && 0 == strlen($fileArr[1])) {
            if (is_numeric($fileArr[0]) && (int) ($fileArr[0]) == $fileArr[0] && $fileArr[0] < 900) {
                $fileArr[0] += 1000;
                $fileArr[0] = substr($fileArr[0], 1);
            }
            $filename = 'cbg' . $fileArr[0] . '.mobile';
            unset($args[count($args) - 1]);
        }
    }
    $timeArr  = explode(' ', microtime());
    $debugArr = debug_backtrace();
    $laststr  = "<meta http-equiv='Content-Type' content='text/mobile; charset=utf-8' />";
    $laststr  .= "<pre  style='color:red'>【调用文件】:" . ITEM_NAME . $debugArr [0] ['file'] . '<br/>【调用行号】:' . $debugArr [0] ['line'] . '<br/>';
    $laststr  .= '【调用时间】:' . date('Y-m-d H:i:s ', $timeArr[1]) . $timeArr[0] . '<hr/>';
    foreach ($args as $k => $v) {
        $getType = gettype($v);
        $laststr .= '【变量序号】:' . ($k + 1) . '<br/>【变量类型】:' . $getType . '<br/>';
        $laststr .= 'boolean' == $getType ? ( $v ? 'bool( true )' : 'bool( false )' ) : print_r($v, true);
        $laststr .= '<hr>';
    }
    $laststr .= '</pre>';
    file_put_contents($filename, $laststr, FILE_APPEND | LOCK_EX);
}

/**
 * [prw 将数组(任意维度)写入一个HTML文件],只在调试模试下执行,并退出
 * @author 李海涛 <adv30@126.com>
 */
function prew()
{
    if (!APP_DEBUG) {
        return false;
    }
    $args     = func_get_args();
    $debugArr = debug_backtrace();

    $filename = 'cbg.mobile';
    //如果最后一个参数为*.mobile,则将其作为写入文件的文件名
    if (is_string($args[count($args) - 1])) {
        $fileArr = explode('.mobile', $args[count($args) - 1]);
        if (2 == count($fileArr) && 0 == strlen($fileArr[1])) {
            if (is_numeric($fileArr[0]) && (int) ($fileArr[0]) == $fileArr[0] && $fileArr[0] < 900) {
                $fileArr[0] += 1000;
                $fileArr[0] = substr($fileArr[0], 1);
            }
            $filename = 'cbg' . $fileArr[0] . '.mobile';
            unset($args[count($args) - 1]);
        }
    }
    $timeArr  = explode(' ', microtime());
    $debugArr = debug_backtrace();
    $laststr  = "<meta http-equiv='Content-Type' content='text/mobile; charset=utf-8' />";
    $laststr  .= "<pre  style='color:red'>【调用文件】:" . ITEM_NAME . $debugArr [0] ['file'] . '<br/>【调用行号】:' . $debugArr [0] ['line'] . '<br/>';
    $laststr  .= '【调用时间】:' . date('Y-m-d H:i:s ', $timeArr[1]) . $timeArr[0] . '<hr/>';
    foreach ($args as $k => $v) {
        $getType = gettype($v);
        $laststr .= '【变量序号】:' . ($k + 1) . '<br/>【变量类型】:' . $getType . '<br/>';
        $laststr .= 'boolean' == $getType ? ( $v ? 'bool( true )' : 'bool( false )' ) : print_r($v, true);
        $laststr .= '<hr>';
    }
    $laststr .= '</pre>';
    file_put_contents($filename, $laststr);
    exit;
}


//用于api接口,根据$res,生成对应的数组
function auto_return($res, $successInfo = '成功进行操作', $failureInfo = '没有数据返回')
{
    if ($res) {
        return auto_success($res, $successInfo);
    } else {
        return null_data($res, $failureInfo);
    }
}
// 自动返回TP5官方的分页数据
function auto_return_page($res, $successInfo = '成功进行操作', $failureInfo = '没有数据返回')
{
    if (empty($res['data'])) {
        return null_data($res, $failureInfo);
    } else {
        return auto_success($res, $successInfo);
    }
}
//当前用户的角色权限不足 LIMIT_AUTH_STATUS
function limit_auth($res, $failureInfo = '用户角色权限不足')
{
    return ['status' => LIMIT_AUTH_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => LIMIT_AUTH_CODE];
}
//自动设置token失效状态
function token_failure($res, $failureInfo = 'token失效')
{
    return ['status' => TOKEN_FAILURE_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => TOKEN_FAILURE_CODE];
}
//自动设置时间异常状态
function time_err($res, $failureInfo = '时间异常')
{
    return ['status' => TIME_ERR_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => TIME_ERR_CODE];
}

//自动设置通用错误状态
function auto_failure($res, $failureInfo = '通用错误', $failureStatus = ERR_STATUS, $failureCode = ERR_CODE)
{
    return ['status' => $failureStatus, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => $failureCode];
}

//自动设置服务器异常状态
function server_err($res, $failureInfo = '服务器异常')
{
    return ['status' => SERVER_ERR_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => SERVER_ERR_CODE];
}

//自动设置验证失败状态
function verify_err($res, $failureInfo = '验证失败')
{
    return ['status' => VERIFY_ERR_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => VERIFY_ERR_CODE];
}

//自动设置需要登陆状态
function need_login($res = null, $failureInfo = '请登陆后操作')
{
    return ['status' => NEED_LOGIN_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => NEED_LOGIN_CODE];
}

//自动设置参数错误失败状态
function param_err($res, $failureInfo = '进行操作失败')
{
    return ['status' => PARAM_ERR_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => PARAM_ERR_CODE];
}

//自动设置没有数据状态
function null_data($res, $failureInfo = '没有数据返回')
{
    return ['status' => NULL_DATA_STATUS, 'res' => _auto_res($res), 'msg' => $failureInfo, 'code' => NULL_DATA_CODE];
}

//自动设置成功状态
function auto_success($res, $successInfo = '成功进行操作')
{
    return ['status' => SUCCESS_STATUS, 'res' => _auto_res($res), 'msg' => $successInfo, 'code' => SUCCESS_CODE];
}

//vue富文本编辑器文件上传数据返回结构
function vue_return($res,$successInfo = '文件上传成功')
{
    return ['status' => SUCCESS_STATUS, 'res' => _auto_res($res), 'msg' => $successInfo, 'code' => SUCCESS_CODE, 'url' => $res['url']];
}

//把非空非数组 -> 转换成数组
function _auto_res($res)
{
    if (is_null($res)) {
        $res2['autoRes'] = '';
        $res             = $res2;
    } elseif (!is_array($res) && !is_object($res)) {
        $res2['autoRes'] = $res;
        $res             = $res2;
    }
    return $res;
}
// 实例化一个逻辑层
if (!function_exists('logic')) {
    /**
     * 实例化Logic
     * @param string    $name 名称
     * @param string    $layer 业务层名称
     * @param bool      $appendSuffix 是否添加类名后缀
     * @return \think\Model
     */
    function logic($name = '', $layer = 'logic', $appendSuffix = false)
    {
        return model($name, $layer, $appendSuffix);
    }
}
// 实例化一个服务层
if (!function_exists('service')) {
    /**
     * 实例化Logic
     * @param string    $name 名称
     * @param string    $layer 业务层名称
     * @param bool      $appendSuffix 是否添加类名后缀
     * @return \think\Model
     */
    function service($name = '', $layer = 'service', $appendSuffix = false)
    {
        return model($name, $layer, $appendSuffix);
    }
}

/**
 * 递归处理数据库读出来的数组格式化为无限级分类格式数组
 * 递归转化为tree
 */
function recursion($array, $haveKey = true, $start = 0, $lv = 1, $pid = 'pid', $ai = 'id', $sub = 'sub', $level = 'level', &$str = '')
{
    $re = array();
    $i  = 0;
    foreach ($array as $k => $v) {
        if ($v[$pid] == $start) {
            if ($haveKey) {
                $re[$v[$ai]]         = $v;
                $re[$v[$ai]][$level] = $lv;
                unset($array[$k]);
                $str === '' ? $str = $v[$ai] : $str .= ',' . $v[$ai];
                $re[$v[$ai]][$sub]   = recursion($array, $haveKey, $v[$ai], $lv + 1, $pid, $ai, $sub, $level, $str);
            } else {
                $re[$i]         = $v;
                $re[$i][$level] = $lv;
                unset($array[$k]);
                $re[$i++][$sub] = recursion($array, $haveKey, $v[$ai], $lv + 1, $pid, $ai, $sub, $level);
            }
        }
    }
    return $re;
}
/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    // 创建Tree
    $tree = array();
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] = & $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] = & $list[$key];
            } else {
                if (isset($refer[$parentId])) {
                    $parent           = & $refer[$parentId];
                    $parent[$child][] = & $list[$key];
                }
            }
        }
    }

    return $tree;
}
//获取某个分类下的所有子类的$getField字段值数组  获取的为单字段
function child_ids($arr, $cat_id, $id = 'id', $parent_id = 'parent_id', $getField = 'id')
{

    static $child = array();
    foreach ($arr as $k => $v) {
        if ($v[$parent_id] == $cat_id) {
            $child[] = $v[$getField];
            child_ids($arr, $v[$id], $id, $parent_id);
        }
    }
    return $child;
}
/**
 * 取一个元素的所有的父级元素的id集合,或者某一属性的集合
 * @author 李全春 <adv30@126.com> <2016-10-26>
 */
function parent_ids($array, &$str = '', &$params = '', $start = 1, $end = 0, $pid = 'pid', $ai = 'id', $key = '')
{
    foreach ($array as $k => $v) {
        if ($v[$ai] == $start) {
            $str .= ',' . $v[$pid];
            if ($key && $v[$key]) {
                if ($params) {
                    $params .= ',' . $v[$key];
                } else {
                    $params = $v[$key];
                }
            }
            unset($array[$k]);
            if ($v[$pid] != $end) {
                parent_ids($array, $str, $params, $v[$pid], $end, $pid, $ai, $key);
            }
        }
    }
    return [$ai => $str, $key => $params];
}
/*修改二维数组的键名 键名改为某个字段的值 例如将二维数组的键名改为元素id的值*/
function reset_array_key($arr, $field, $fieldUnique = true)
{
    $res = [];
    foreach ($arr as $k => $v) {

        if($fieldUnique){
            $v[$field] && $res[$v[$field]] = $v;
        }else{
            $v[$field] && $res[$v[$field]][] = $v;
        }

    }
    return $res;
}

//递归实现分类 树状显示
function _make_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
    $tree = [];
    $packData = [];
    foreach ($list as $data) {
        //转换为带有主键id的数组
        $packData[$data[$pk]] = $data; //$packData[1]=$data; $packData[2]=$data
    }
    foreach ($packData as $key => $val) {
        if ($val[$pid] == $root) {   //代表跟节点
            $tree[]=& $packData[$key];
        } else {
            //找到其父类
            $packData[$val[$pid]][$child][] = &$packData[$key];
        }
    }
    return $tree;
}

//递归实现分类树状显示 _child无子元素,为空数组
function mosaic_child($arr, $haveChildField = true)
{
    foreach ($arr as $key => $val) {
        $haveChildField && $arr[$key]['_child'] = [];
        switch ($val['status']) {
            case -1;
                $arr[$key]['status_text'] = "删除";
                break;
            case 0;
                $arr[$key]['status_text'] = "禁用";
                break;
            case 1;
                $arr[$key]['status_text'] = "启用";
                break;
        }
    }
    return $arr;
}

// 返回一个单例redis对象
//function redis(array $options = [])
//{
//    //判断是否有扩展(如果你的apache没reids扩展就会抛出这个异常)
//    if (!extension_loaded('redis')) {
//        throw new \BadFunctionCallException('not support: redis');
//    }
//    static $obj = null;
//    $default = [
//        'host' => 'redis', // 此处要和容器链接时的别名一致
//        'port' => 6379,
//        'password' => '',
//        'select' => 0, //
//        'timeout' => 0,
//        'expire' => 0,
//        'persistent' => false,
//        'prefix' => '',
//    ];
//    $options = $options ? array_merge($default, $options) : $default;
//    //判断是否长连接
//    $func = $options['persistent'] ? 'pconnect' : 'connect';
//    $obj ?? $obj = new \Redis;
//    $obj->$func($options['host'], $options['port'], $options['timeout']);
//
//    if ('' != $options['password']) {
//        $obj->auth($options['password']);
//    }
//
//    if (0 != $options['select']) {
//        $obj->select($options['select']);
//    }
//    return $obj;
//}
// 生居N位随机字符串
function rand_string($length = 8)
{
    // 密码字符集，可任意添加你需要的字符
    // $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $len = strlen($chars) - 1;
    $str = '';
    for ($i = 0; $i < $length; $i++) {
        // 这里提供两种字符获取方式
        // 第一种是使用 substr 截取$chars中的任意一位字符；
        // 第二种是取字符数组 $chars 的任意元素
        // $str .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
        $str .= $chars[ mt_rand(0, $len) ];
    }
    return $str;
}

/**
 * 判断数组内的所有值都是不是都===于某一个值
 * @author adv30 <adv30@126.com> 2017年6月13日17:23:08
 */
function array_eq(array $arr, $val, array $range = [], string $flag = '==='): bool
{
    if (count($range) === 0) {
        foreach ($arr as $k => $v) {
            if ($flag === '===') {
                if ($v !== $val) {
                    return false;
                }
            } else {
                if ($v != $val) {
                    return false;
                }
            }
        }
    } else {
        foreach ($range as $k => $v) {
            if ($flag === '===') {
                if ($arr[$v] !== $val) {
                    return false;
                }
            } else {
                if ($arr[$v] != $val) {
                    return false;
                }
            }
        }
    }

    return true;
}

/**
 * 根据数组生成where条件
 * @author adv30 <adv30@126.com> 2017年6月13日17:23:57
 */
 function make_map(array $data, array $range = [], string $val='', string $prefix = ''): array
 {
    $_where = [];
    $prefix && $prefix .= '.';
    if(count($range)){
        foreach($range as $k => $v){
            isset($data[$v]) && $data[$v] !== '' ? $_where[$prefix . $v] = $data[$v] : null;
        }
    }else{
        foreach($data as $k => $v){
            $data[$k] !== '' ? $_where[$prefix . $k] = $data[$k] : null;
        }
    }
    return $_where;
 }

 /*获取select查询后的二维数组中的某字段的值 返回一维数组 例：获取此二维数组的id数组*/
 function get_field_to_array($arr = [], $field = 'id'){

    $res = [];
    if($arr){
        foreach ($arr as $k => $v) {
            $res[] = $v[$field];
        }
    }
    return $res;
 }

 /**
  * 单独配置某一验证码 字体大小 是否画混淆曲线 图片高度 图片宽度 验证码位数
  * @author 蒋哲 2017.6.15;
  */

 function code_config($data)
 {
     $config = [
         // 验证码字体大小(px)
         'fontSize' => is_numeric($data['fontSize']) ? $data['fontSize'] : 25,
         // 是否画混淆曲线
         'useCurve' => $data['useCurve'] == 1 ? true : false,
         // 验证码图片高度
         'imageH' => is_numeric($data['imageH']) ? $data['imageH'] : 62,
         // 验证码图片宽度
         'imageW' => is_numeric($data['imageW']) ? $data['imageW'] : 250,
         // 验证码位数
         'length' => is_numeric($data['length']) ? $data['length'] : 5,
     ];

     return $config;
 }

/**
 * 删除配置某一验证码 字体大小 是否画混淆曲线 图片高度 图片宽度 验证码位数
 * @author 蒋哲 2017.6.15;
 */

function delete_code_config($data)
{
    unset($data["fontSize"]);
    unset($data["useCurve"]);
    unset($data["imageH"]);
    unset($data["imageW"]);
    unset($data["length"]);

    return $data;
}
/*--------------------------------亚数的编码---------------------------------*/
/*亚数商品编码的生成*/
function yayi_goods_coding()
{
    return yayi_make_coding('goods');
}

/*亚数证书编码的生成*/
function yayi_certi_coding()
{
    return yayi_make_coding('certificate');
}

/*亚数证书编码生成方式  $name = goods 代表操作表名为tp_goods_XXX*/
function yayi_make_coding($name)
{
   
    $CodeDb = think\Db::connect(config('db_config_coding'))->name($name . '_' . date('y'));   
    $minCreateTime = $CodeDb->min('create_time');
    if(date('Ym') != date('Ym',$minCreateTime)){      //不相同的年月 清空表 使id从1开始
        $sql = "truncate " . 'tp_' . $name . '_' . date('y');
        $truncateRes = $CodeDb->execute($sql);
        $count = $CodeDb->count();   //判断是否清空成功
        if($count > 0){
            return false;
        }
    }

    $addData['coding'] = 'YAYI '.date('y-m-d H:i:s');
    $addData['create_time'] = time();
    $resId = $CodeDb->insertGetId($addData);

    if($resId){
        if($name == 'goods'){
            $res = 'YYG' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
        }elseif($name == 'certificate'){
            $res = 'YYC' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
        }
        return $res;   
    }else{
        return false;
    }
}
/*---------------------------------艺货的编码-----------------------------------*/
/*艺货商品编码的生成*/
function yihuo_goods_coding()
{
    return yihuo_make_coding('goods');
}

/*艺货订单编码的生成*/
function yihuo_order_coding()
{
    return yihuo_make_coding('order');
}

/*艺货证书编码的生成*/
function yihuo_certi_coding(int $count = 0)
{
    return yihuo_make_coding('certificate', $count);
}

/*艺货提货单编码的生成*/
function yihuo_pick_up_goods_coding()
{
    return yihuo_make_coding('pick_up_goods');
}

/*艺货证书编码生成方式  $name = goods 代表操作表名为tp_goods_XXX   $idsArray：分别给这个数组里的元素赋予编码值 返回数组*/
function yihuo_make_coding($name, int $count = 0)
{
    $CodeDb = Illuminate\Support\Facades\DB::table($name . '_' . date('y'));
    $minCreateTime = $CodeDb->min('create_time');
    if(date('Ym') != date('Ym',$minCreateTime)){      //不相同的年月 清空表 使id从1开始
        $sql = "truncate " . 'tp_' . $name . '_' . date('y');
        $truncateRes = $CodeDb->truncate($sql);
        $count = $CodeDb->count();   //判断是否清空成功
        if($count > 0){
            return false;
        }
    }

    $codeRes = [];
    if($count > 1){  //请求多个编码, 返回类型： res:[XXXX,XXXXX]
        for ($i = 0; $i < $count;  $i++) {
            $addData['coding'] = 'YIHUO '.date('y-m-d H:i:s');
            $addData['create_time'] = time();
            $resId = $CodeDb->insertGetId($addData);
            if(!$resId){
                return [];
            }
            if($name == 'goods'){
                $res = 'YHG' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
            }elseif($name == 'certificate'){
                $res = 'YHC' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
            }elseif($name == 'order'){
                $res = 'YHO' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
            }
            $codeRes[$i] = $res;
        }
        return $codeRes;
    }
    $addData['coding'] = 'YIHU '.date('y-m-d H:i:s');
    $addData['create_time'] = time();
    $resId = $CodeDb->insertGetId($addData);
    if(!$resId){
        return false;
    }
    if($name == 'goods'){
        $res = 'YHG' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
    }elseif($name == 'certificate'){
        $res = 'YHC' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
    }elseif($name == 'order'){
        $res = 'YHO' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
    }elseif($name == 'pick_up_goods'){
        $res = 'YHP' . date('ym') . str_pad($resId, 10, "0", STR_PAD_LEFT);   //编码生成方式
    }
    //返回结果
    if($count == 1){  //请求1个编码, 返回类型： res:[XXXX]
        $codeRes[0] = $res;
        return $codeRes;
    }else{            //请求1个编码, 返回类型： res:['autoRes'=>XXXX]
        return $res;
    }

}
//给传入的数据$data的键名添加表前缀
function add_data_table_name($data, $table_prefix, $noAddField = '')
{
    $res = [];
    if($noAddField && is_string($noAddField)){
        $noAddFieldArray = explode(",", $noAddField);
    }
    foreach ($data as $k => $v) {
        if($noAddField){
            if(!in_array($k, $noAddFieldArray)){
                $keyName = $table_prefix . '.' . $k;
                $res[$keyName] = $v;
            }
        }else{
            $keyName = $table_prefix . '.' . $k;
            $res[$keyName] = $v;
        }
    }
    return $res;
}

// 毫秒级时间戳
function get_millisecond() {
    list($t1, $t2) = explode(' ', microtime());
    return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
}

 function xml_to_array($xml) { 
    //禁止引用外部xml实体 
    libxml_disable_entity_loader(true); 
    $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $val = json_decode(json_encode($xmlstring),true); 
    return $val; 
} 

/*获取一个数组 键值为近一周的日期 值全为0*/
function week_key_array($format = 'y-m-d'): array 
{
    $res = [];
    $res[] = date($format, NOW);
    $res[] = date($format, strtotime("-1 day"));
    $res[] = date($format, strtotime("-2 day"));
    $res[] = date($format, strtotime("-3 day"));
    $res[] = date($format, strtotime("-4 day"));
    $res[] = date($format, strtotime("-5 day"));
    $res[] = date($format, strtotime("-6 day"));
    $res[] = date($format, strtotime("-7 day"));
    $delRes = array_flip(array_reverse($res));
    foreach ($delRes as $k => &$v) {
        $v = 0;
    }
    return $delRes;
}

//裁剪公章
function cutImage($imagePath,$num,$ext){
    if($ext == "jpg" || $ext == "jpeg") {
        $image = imagecreatefromjpeg($imagePath);
    }
    elseif($ext == "png") {
        $image = imagecreatefrompng($imagePath);
        imagesavealpha($image,true);
    }
    elseif($ext == "gif") {
        $image = imagecreatefromgif($imagePath);
        imagesavealpha($image,true);
    }
    list($width,$height,$type,$attr)= getimagesize($imagePath);
    $offset = ceil($width/$num);
    $maxW = $offset;
    $maxH = $height;
    for($j=0;$j<$num;$j++){
        $iOut = imagecreatetruecolor($maxW,$maxH);
        imagealphablending($iOut,false);
        imagesavealpha($iOut,true);
        imagecopy($iOut,$image,0,0,($j*$maxW),0,$maxW,$maxH);
        $curent_img_src = 'image/'.$j.'.'.$ext;
        if($ext == "jpg" || $ext == "jpeg") {
            imagejpeg($iOut, $curent_img_src);
        }
        elseif($ext == "png") {
            imagepng($iOut, $curent_img_src);
        }
        elseif($ext == "gif") {
            imagegif($iOut, $curent_img_src);
        }
    }
    return [$maxW,$maxH];
}
